题目地址 (opens new window)

  • 🙂 第一次练习 2020-06-05 大概能想到那个方向上的思路。但是让自己来写。真正的代码实现上还是有一点问题的。
  • 😄 第二次练习

# 迭代打印

时间复杂度:O(h * n)

空间复杂度:O (n)

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ret = new ArrayList<>();
        if (matrix == null || matrix.length == 0) {
            return ret;
        }

        int top = 0;
        int left = 0;
        int bottom = matrix.length - 1;
        int right = matrix[0].length - 1;

        // 赋值上 下 左 右 边界
        while (true) {
            // right
            for (int i = left; i <= right; i++) {
                ret.add(matrix[top][i]);
            }
            if (++top > bottom) {
                break;
            }

            for (int i = top; i <= bottom; i++) {
                ret.add(matrix[i][right]);
            }
            if (--right < left) {
                break;
            }

            for (int i = right; i >= left; i--) {
                ret.add(matrix[bottom][i]);
            }
            if (--bottom < top) {
                break;
            }

            for (int i = bottom; i >= top; i--) {
                ret.add(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
        }
        return ret;
    }
}

这个是要返回数组。需要控制一下

     public int[] spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0];
        }

        int top = 0;
        int left = 0;
        int bottom = matrix.length - 1;
        int right = matrix[0].length - 1;

        int[] ret = new int[(right + 1) * (bottom + 1)];
        int idx = 0;

        // 赋值上 下 左 右 边界
        while (true) {
            // right
            for (int i = left; i <= right; i++) {
                ret[idx ++] = (matrix[top][i]);
            }
            if (++top > bottom) {
                break;
            }

            for (int i = top; i <= bottom; i++) {
                ret[idx ++] = matrix[i][right];
            }
            if (--right < left) {
                break;
            }

            for (int i = right; i >= left; i--) {
                ret[idx ++] = matrix[bottom][i];
            }
            if (--bottom < top) {
                break;
            }

            for (int i = bottom; i >= top; i--) {
                ret[idx ++] = matrix[i][left];
            }
            if (++left > right) {
                break;
            }
        }
        return ret;
    }

# 易错点

  • 易错项 1
最后编辑时间: 7/14/2020, 9:21:47 AM